package com.dingreading.cloud.admin.util;

import org.springframework.web.multipart.MultipartFile;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class WaterMarkUtil {


    // 源图片路径
    private static final String srcImgPath = "C:\\Users\\byz\\Desktop\\pic2.png";
    // 目标图片路径
    private static final String targerPath = "C:\\Users\\byz\\Desktop\\st3.png";

    /**
     * 将MultipartFile转换为File
     *
     * @param multiFile
     * @return
     */
    public static File MultipartFileToFile(MultipartFile multiFile) {
        // 获取文件名
        String fileName = multiFile.getOriginalFilename();
        // 获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        // 若须要防止生成的临时文件重复,能够在文件名后添加随机码

        try {
            File file = File.createTempFile(fileName, prefix);
            multiFile.transferTo(file);
            return file;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        String water = "C:\\Users\\byz\\Desktop\\water.png";
        WaterMarkUtil.markImageByIcon(new File(srcImgPath), water);
//        WaterMarkUtil.markImageByIcon2(new File("C:\\Users\\byz\\Desktop\\pic2.png"), water);

//        compress(new File(srcImgPath),new File(targerPath),0,0.5f);
    }

    /**
     * 图片添加水印图并输出图片、可设置水印图片旋转角度
     */
    public static void markImageByIcon(File file, String waterImgUrl) {
        FileOutputStream fos = null;
        try {
            // 读取原图片信息 得到文件（本地图片）
            //将文件对象转化为图片对象
            Image srcImg = ImageIO.read(file);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);

            //创建一个URL对象,获取网络图片的地址信息（网络图片）
//        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
//        //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
//        Image srcImg = ImageIO.read(url.openStream());
//        //获取图片的宽
//        int srcImgWidth = srcImg.getWidth(null);
//        //获取图片的高
//        int srcImgHeight = srcImg.getHeight(null);
//        System.out.println("图片的宽:"+srcImgWidth);
//        System.out.println("图片的高:"+srcImgHeight);

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
//        //根据图片的背景设置水印颜色
//        g.setColor(new Color(255,255,255,128));
//        //设置字体  画笔字体样式为微软雅黑，加粗，文字大小为60pt
//        g.setFont(new Font("微软雅黑", Font.BOLD, 60));
//        String waterMarkContent="图片来源：https://image.baidu.com/";
//        //设置水印的坐标(为原图片中间位置)
//        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//        int y=srcImgHeight / 2;
//        //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
//        g.drawString(waterMarkContent, x, y);
//        g.dispose();
            //-------------------------文字水印 end----------------------------

            //-------------------------图片水印 start----------------------------
            // 水印文件
            Image srcWaterMark = ImageIO.read(new File(waterImgUrl));
            //获取水印图片的宽度
            int widthWaterMark = srcWaterMark.getWidth(null);
            //获取水印图片的高度
            int heightWaterMark = srcWaterMark.getHeight(null);
            //设置 alpha 透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
            //绘制水印图片  坐标为中间位置
            g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
                    (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
            // 水印文件结束
            g.dispose();
            //-------------------------图片水印 end----------------------------

            //设置图片质量
//            JPEGEncodeParam jep =   JPEGCodec.getDefaultJPEGEncodeParam(bufImg);
//            jep.setQuality(0.7f, true);
//            // 输出图片
//            fos = new FileOutputStream(targerPath);
//            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
//            encoder.setJPEGEncodeParam(jep);
//            encoder.encode(bufImg);

            //设置图片质量
            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();
            if (param.canWriteCompressed()) {
                // 指定压缩方式为MODE_EXPLICIT
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                // 设置压缩质量参数，参数qality是取值0~1范围内
                param.setCompressionQuality(0.7f);
            }

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            IIOImage iIamge = new IIOImage(bufImg, null, null);
            writer.setOutput(ImageIO.createImageOutputStream(out));
            writer.write(null, iIamge, param);

            // 保存输出图片
            fos = new FileOutputStream(targerPath);
            fos.write(out.toByteArray());

            System.out.println("添加水印完成");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fos) {
                    fos.flush();
                    fos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void markImageByIcon2(File file, String waterImgUrl) {
        FileOutputStream fos = null;
        try {
            // 读取原图片信息 得到文件（本地图片）
            //将文件对象转化为图片对象
            Image srcImg = ImageIO.read(file);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);

            //创建一个URL对象,获取网络图片的地址信息（网络图片）
//        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
//        //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
//        Image srcImg = ImageIO.read(url.openStream());
//        //获取图片的宽
//        int srcImgWidth = srcImg.getWidth(null);
//        //获取图片的高
//        int srcImgHeight = srcImg.getHeight(null);
//        System.out.println("图片的宽:"+srcImgWidth);
//        System.out.println("图片的高:"+srcImgHeight);

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
//        //根据图片的背景设置水印颜色
//        g.setColor(new Color(255,255,255,128));
//        //设置字体  画笔字体样式为微软雅黑，加粗，文字大小为60pt
//        g.setFont(new Font("微软雅黑", Font.BOLD, 60));
//        String waterMarkContent="图片来源：https://image.baidu.com/";
//        //设置水印的坐标(为原图片中间位置)
//        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//        int y=srcImgHeight / 2;
//        //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
//        g.drawString(waterMarkContent, x, y);
//        g.dispose();
            //-------------------------文字水印 end----------------------------

            //-------------------------图片水印 start----------------------------
            // 水印文件
            Image srcWaterMark = ImageIO.read(new File(waterImgUrl));
            //获取水印图片的宽度
            int widthWaterMark = srcWaterMark.getWidth(null);
            //获取水印图片的高度
            int heightWaterMark = srcWaterMark.getHeight(null);
            //设置 alpha 透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
            //绘制水印图片  坐标为中间位置
            g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
                    (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
            // 水印文件结束
            g.dispose();
            //-------------------------图片水印 end----------------------------

            //设置图片质量
//            JPEGEncodeParam jep =   JPEGCodec.getDefaultJPEGEncodeParam(bufImg);
//            jep.setQuality(0.7f, true);
//            // 输出图片
//            fos = new FileOutputStream(targerPath);
//            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
//            encoder.setJPEGEncodeParam(jep);
//            encoder.encode(bufImg);

            //设置图片质量
//            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
//            ImageWriteParam param = writer.getDefaultWriteParam();
//            if (param.canWriteCompressed()) {
//                // 指定压缩方式为MODE_EXPLICIT
//                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
//                // 设置压缩质量参数，参数qality是取值0~1范围内
//                param.setCompressionQuality(0.7f);
//            }
//
//            ByteArrayOutputStream out = new ByteArrayOutputStream();
//            IIOImage iIamge = new IIOImage(bufImg, null, null);
//            writer.setOutput(ImageIO.createImageOutputStream(out));
//            writer.write(null, iIamge, param);

            // 保存输出图片
            fos = new FileOutputStream(targerPath);
            ImageIO.write(bufImg, "png", fos);

            System.out.println("添加水印完成");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fos) {
                    fos.flush();
                    fos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static InputStream markImageByIconToStream(File file, String waterImgUrl) {
        ByteArrayOutputStream os = null;
        try {
            // 读取原图片信息 得到文件（本地图片）
            //将文件对象转化为图片对象
            Image srcImg = ImageIO.read(file);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);

            //创建一个URL对象,获取网络图片的地址信息（网络图片）
//        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
//        //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
//        Image srcImg = ImageIO.read(url.openStream());
//        //获取图片的宽
//        int srcImgWidth = srcImg.getWidth(null);
//        //获取图片的高
//        int srcImgHeight = srcImg.getHeight(null);
//        System.out.println("图片的宽:"+srcImgWidth);
//        System.out.println("图片的高:"+srcImgHeight);


            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
//        //根据图片的背景设置水印颜色
//        g.setColor(new Color(255,255,255,128));
//        //设置字体  画笔字体样式为微软雅黑，加粗，文字大小为60pt
//        g.setFont(new Font("微软雅黑", Font.BOLD, 60));
//        String waterMarkContent="图片来源：https://image.baidu.com/";
//        //设置水印的坐标(为原图片中间位置)
//        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//        int y=srcImgHeight / 2;
//        //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
//        g.drawString(waterMarkContent, x, y);
//        g.dispose();
            //-------------------------文字水印 end----------------------------

            //-------------------------图片水印 start----------------------------
            // 水印文件
            Image srcWaterMark = ImageIO.read(new File(waterImgUrl));
            //获取水印图片的宽度
            int widthWaterMark = srcWaterMark.getWidth(null);
            //获取水印图片的高度
            int heightWaterMark = srcWaterMark.getHeight(null);
            //设置 alpha 透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
            //绘制水印图片  坐标为中间位置
            g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
                    (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
            // 水印文件结束
            g.dispose();
            //-------------------------图片水印 end----------------------------

            //设置图片质量
            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();
            if (param.canWriteCompressed()) {
                // 指定压缩方式为MODE_EXPLICIT
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                // 设置压缩质量参数，参数qality是取值0~1范围内
                param.setCompressionQuality(0.7f);
            }

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            IIOImage iIamge = new IIOImage(bufImg, null, null);
            writer.setOutput(ImageIO.createImageOutputStream(out));
            writer.write(null, iIamge, param);

            return new ByteArrayInputStream(out.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.flush();
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}
